package datastruct.queue;

import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
 * 队列(数组)
 * 条件判断：(front：第一个元素前一个位置；  rear：最后一个元素)
 *  队列已满：rear + 1 == maxSize
 *  队列为空：front == rear
 */
public class ArrayQueue<T> {

    private Object[] queue;  // 队列数组
    private int front = -1;  // 队头指针(指向：第一个元素的前一个位置)
    private int rear = -1;   // 队尾指针(指向：最后一个元素)
    private int maxSize;    // 最大容量

    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        this.queue = new Object[maxSize];
    }

    /**
     * 添加元素，队列满抛异常
     */
    public void add(T e) {
        isFull();
        this.queue[++rear] = e;
    }

    /**
     * 队头元素出队，队列空抛异常
     */
    public T remove() {
        isEmpty();
        return (T) this.queue[++front];
    }

    /**
     * 获取队头元素，队列空抛异常
     */
    public T element() {
        isEmpty();
        return (T) this.queue[front + 1];
    }

    /**
     * 判断队列已满
     */
    private void isFull() {
        if (rear == (maxSize - 1)) {
            throw new RuntimeException("队列已满");
        }
    }

    /**
     * 判断队列元素为空
     */
    private void isEmpty() {
        if (front == rear) {
            throw new RuntimeException("队列为空");
        }
    }

    @Override
    public String toString() {
        return IntStream.range(front + 1, rear + 1)
                .mapToObj(i -> String.valueOf(queue[i]))
                .collect(Collectors.joining(", ", "[", "]"));
    }
}
